﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using vudu.Logica.Clases;
using vudu.Logica.Excepciones;

namespace vudu.EnlaceDatos.SqlServer
{
    /// <summary>
    /// Clase que hace las operaciones de mantenimiento de la entidad Salon para la base de datos
    /// sqlserver
    /// </summary>
    public class SqlServerSalon
    {
        /// <summary>
        /// Metodo que realiza la llamada al stored procedure para insertar un salon
        /// </summary>
        /// <param name="salon"></param>
        /// <returns></returns>
         public int InsertarSalon(Salon salon)
         {
             //se instancia un objeto de tipo conexion y sqlCommand
             //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
             Conexion miConexion = new Conexion();
             SqlCommand command = new SqlCommand();

             int idInsertado = -1;
             try
             {
                 miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                 // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                 command.Connection = miConexion.ObjetoConexion();
                 command.CommandType = CommandType.StoredProcedure;
                 command.CommandText = "[dbo].[InsertarSalon]";
                 command.CommandTimeout = 10;

                 //variables del stored procedure de sql server.
                 command.Parameters.AddWithValue("@nombre", salon.Nombre);
                 command.Parameters.AddWithValue("@edificio", salon.Edificio);
                 command.Parameters.AddWithValue("@capacidad", salon.Capacidad);
                 command.Parameters.AddWithValue("@tiposalon", salon.Tipo);
                 command.Parameters.AddWithValue("@iduniversidad", salon.Universidad.IdUniv);

                 command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                 command.Parameters["@edificio"].Direction = ParameterDirection.Input;
                 command.Parameters["@capacidad"].Direction = ParameterDirection.Input;
                 command.Parameters["@tiposalon"].Direction = ParameterDirection.Input;
                 command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;

                 //se ejecuta el comando
                 SqlDataReader reader = command.ExecuteReader();
                 while (reader.Read())
                 {
                     idInsertado = (int) reader[0];
                 }
                 //se lee la variable de tipo output para saber que id fue insertado en base de datos.

             }
             catch (SqlException)
             {
                 throw new TransaccionFallidaExeption();
             }
             catch (ConexionExeption)
             {
                 throw new ConexionExeption();
             }
             catch (Exception)
             {
                 throw new TransaccionFallidaExeption();
             }

            miConexion.CerrarConexionBd();
            return idInsertado;
        }


        /// <summary>
        /// Metodo que modifica los datos de un salon
        /// </summary>
        /// <param name="salon"></param>
        /// <returns></returns>
        public bool ModificarSalon(Salon salon)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            bool retorno;
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ModificarSalon]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@nombre", salon.Nombre);
                command.Parameters.AddWithValue("@edificio", salon.Edificio);
                command.Parameters.AddWithValue("@capacidad", salon.Capacidad);
                command.Parameters.AddWithValue("@tiposalon", salon.Tipo);
                command.Parameters.AddWithValue("@status", salon.Status);
                command.Parameters.AddWithValue("@idSalon", salon.NumeroSalon);
                command.Parameters.AddWithValue("@iduniversidad", salon.Universidad.IdUniv);

                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@edificio"].Direction = ParameterDirection.Input;
                command.Parameters["@capacidad"].Direction = ParameterDirection.Input;
                command.Parameters["@tiposalon"].Direction = ParameterDirection.Input;
                command.Parameters["@status"].Direction = ParameterDirection.Input;
                command.Parameters["@idSalon"].Direction = ParameterDirection.Input;
                command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                command.ExecuteNonQuery();
                retorno = true;
            }
            catch (SqlException)
            {
                throw new TransaccionFallidaExeption();
            }
            catch (ConexionExeption)
            {
                throw new ConexionExeption();
            }
            catch (Exception)
            {
                throw new TransaccionFallidaExeption();
            }


            miConexion.CerrarConexionBd();
            return retorno;
        }


        /// <summary>
        /// Metodo que consulta los datos de un salon dado un nombre
        /// </summary>
        /// <param name="nombre"></param>
        /// <param name="universidad"></param>
        /// <returns></returns>
        public List<Salon> ConsultarSalonNombre(string nombre, Universidad universidad)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            List<Salon> retorno = new List<Salon>();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSalonNombre]";
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@nombre", nombre);
                command.Parameters.AddWithValue("@iduniversidad", universidad.IdUniv);

                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Salon salon = new Salon();

                    salon.NumeroSalon = (int)reader[0];
                    salon.Tipo = (string)reader[1];
                    salon.Nombre = (string) reader[2];
                    salon.Edificio = (string) reader[3];
                    salon.Capacidad = (int) reader[4];
                    salon.Status = (int) reader[5];
                    retorno.Add(salon);
                }

            }
            catch (SqlException)
            {
                throw new TransaccionFallidaExeption();
            }
            catch(ConexionExeption)
            {
                throw new ConexionExeption();       
            }
            catch(Exception)
            {
                throw new TransaccionFallidaExeption();
            }


            miConexion.CerrarConexionBd();
            return retorno;
        }


        /// <summary>
        /// Metodo que consulta los datos de un salon dado un nombre
        /// </summary>
        /// <param name="universidad"></param>
        /// <returns></returns>
        public List<Salon> ConsultarSalonInabilitados(Universidad universidad)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            List<Salon> retorno = new List<Salon>();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSalonInabilitados]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@iduniversidad", universidad.IdUniv);
                command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;

                //se ejecuta el comando
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Salon salon = new Salon();

                    salon.NumeroSalon = (int)reader[0];
                    salon.Tipo = (string)reader[1];
                    salon.Nombre = (string)reader[2];
                    salon.Edificio = (string)reader[3];
                    salon.Capacidad = (int)reader[4];
                    salon.Status = (int)reader[5];
                    retorno.Add(salon);
                }

            }
            catch (SqlException)
            {
                throw new TransaccionFallidaExeption();
            }
            catch (ConexionExeption)
            {
                throw new ConexionExeption();
            }
            catch (Exception)
            {
                throw new TransaccionFallidaExeption();
            }

            miConexion.CerrarConexionBd();
            return retorno;
        }


        /// <summary>
        /// Metodo que consulta todos los datos de los salones por edificio
        /// </summary>
        /// <returns></returns>
        public List<Salon> ConsultarSalonEdificio(string edificio, Universidad universidad)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            List<Salon> retorno = new List<Salon>();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSalonEdificio]";

                command.Parameters.AddWithValue("@edificio", edificio);
                command.Parameters.AddWithValue("@iduniversidad", universidad.IdUniv);

                command.Parameters["@edificio"].Direction = ParameterDirection.Input;
                command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;
                command.CommandTimeout = 10;

                //se ejecuta el comando
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Salon salon = new Salon();
                    salon.NumeroSalon = (int)reader[0];
                    salon.Tipo = (string)reader[1];
                    salon.Nombre = (string)reader[2];
                    salon.Edificio = (string)reader[3];
                    salon.Capacidad = (int)reader[4];
                    salon.Status = (int)reader[5];
                    retorno.Add(salon);
                }

            }
            catch (SqlException)
            {
                throw new TransaccionFallidaExeption();
            }
            catch (ConexionExeption)
            {
                throw new ConexionExeption();
            }
            catch (Exception)
            {
                throw new TransaccionFallidaExeption();
            }


            miConexion.CerrarConexionBd();
            return retorno;
        }


        /// <summary>
        /// Metodo que consulta todos los datos de los salones por tipo
        /// </summary>
        /// <returns></returns>
        public List<Salon> ConsultarSalonTipo(string tipo, Universidad universidad)
        {
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            List<Salon> retorno = new List<Salon>();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                
                
                // se completa el objeto comando, con la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = CommandType.StoredProcedure;
                command.CommandText = "[dbo].[ConsultarSalonTipo]";
                command.CommandTimeout = 10;


                //variables del stored procedure de sql server.
                command.Parameters.AddWithValue("@tipo", tipo);
                command.Parameters.AddWithValue("@iduniversidad", universidad.IdUniv);

                command.Parameters["@tipo"].Direction = ParameterDirection.Input;
                command.Parameters["@iduniversidad"].Direction = ParameterDirection.Input;
                //se ejecuta el comando
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Salon salon = new Salon();
                    salon.NumeroSalon = (int)reader[0];
                    salon.Tipo = (string)reader[1];
                    salon.Nombre = (string)reader[2];
                    salon.Edificio = (string)reader[3];
                    salon.Capacidad = (int)reader[4];
                    salon.Status = (int)reader[5];
                    retorno.Add(salon);
                }

            }
            catch (SqlException)
            {
                throw new TransaccionFallidaExeption();
            }
            catch (ConexionExeption)
            {
                throw new ConexionExeption();
            }
            catch (Exception)
            {
                throw new TransaccionFallidaExeption();
            }


            miConexion.CerrarConexionBd();
            return retorno;
        }

        #region Metodos Grupo 5: No borrar
        //Metodo Grupo 5: No eliminar... Es necesario para el crear HorarioClase
        public List<Salon> ConsultarTodosLosSalones()
        {
            Conexion conex = new Conexion();

            List<Salon> salones = new List<Salon>();
            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SALON";
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Salon salon = new Salon();
                salon.NumeroSalon = reader.GetInt32(0);
                salon.Tipo = reader["tipo"].ToString();
                salon.Nombre = reader["nombre"].ToString();
                salon.Edificio = reader["edificio"].ToString();
                salon.Capacidad = reader.GetInt32(4);
                salon.Status = reader.GetInt32(5);
                salones.Add(salon);

            }
            reader.Close();
            conex.CerrarConexionBd();
            return salones;
        }

        public Salon ConsultarSalon(String codigo)
        {
            Conexion conex = new Conexion();

            Salon salonesDeClase = new Salon();
            SqlCommand command = new SqlCommand();

            conex.AbrirConexionBd();
            command.Connection = conex.ObjetoConexion();
            command.CommandType = System.Data.CommandType.Text;
            command.CommandText = "SELECT * FROM SALON S WHERE S.id_salon =" + codigo;
            command.CommandTimeout = 10;

            SqlDataReader reader = command.ExecuteReader();

            while (reader.Read())
            {
                Salon salon = new Salon();
                salon.NumeroSalon = reader.GetInt32(0);
                salon.Tipo = reader["tipo"].ToString();
                salon.Nombre = reader["nombre"].ToString();
                salon.Edificio = reader["edificio"].ToString();
                salon.Capacidad = reader.GetInt32(4);
                salon.Status = reader.GetInt32(5);
                salonesDeClase = salon;

            }
            reader.Close();
            conex.CerrarConexionBd();
            return salonesDeClase;
        }

        #endregion Metodos Grupo 5: No borrar
    
    
    }
}